Scala trait with implicit bound
intro
Sometimes when we define traits with type parameters, we would like to have some implicit evidence for that type parameters. However traits do not allow us to have any parameters.
concrete example
Lets say we want to implement a Monad
instance for something. We know that for something to be a monad, it should be a Functor
first.
So our natural desire would be to write something like
trait Monad[F[_]:Functor]
That will be desugared into
trait Monad[F[_]](implicit functor:Functor[F])
And that will produce a compile error because traits can't have parameters.
workaround
trait Monad[F[_]] {
implicit def functor:Functor[F]
}
implicit def monadInstance[F[_]](implicit f:Functor[F]) = new Monad { functor = f}